package pkg1;


import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
//import org.apache.lucene.document.IntField;
import org.apache.lucene.document.IntRange;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;


/**
 * <pre>
 *  Lucene创建索引服务类
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 *
 * <pre>
 * 修改记录
 *    修改后版本:     修改人：  修改日期:2018年04月18日     修改内容:
 *          </pre>
 */
public class LuceneIndexer {

    private volatile static LuceneIndexer instance;

    private final static String INDEX_DIR = "D:\\data\\lucene";

    private static class SingletonHolder {
        private final static LuceneIndexer instance = new LuceneIndexer();
    }

    public static LuceneIndexer getInstance() {
        return SingletonHolder.instance;
    }

    public boolean createIndex(String indexDir) throws IOException {
        //加点测试的静态数据
        Integer ids[] = {1, 2, 3};
        String titles[] = {"标题1", "标题2", "标题3"};
        String tcontents[] = {
                "内容1内容啊哈哈哈陈培根",
                "内容2内容啊哈哈哈陈思思",
                "内容3内容啊哈哈哈张俊熙"
        };

        long startTime = System.currentTimeMillis();//记录索引开始时间

        // 创建使用的分词器
        Analyzer analyzer = new SmartChineseAnalyzer();
// 索引存放目录
// 存放到文件系统中
        Directory directory = FSDirectory.open(Paths.get(indexDir));
        // 索引配置对象

//        4. IndexWriterConfig  写索引配置：
//
//        使用的分词器，
//
//        如何打开索引（是新建，还是追加）。
//
//        还可配置缓冲区大小、或缓存多少个文档，再刷新到存储中。
//
//        还可配置合并、删除等的策略。
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        // 设置索引库的打开模式：新建、追加、新建或追加
        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

// 创建索引写对象，用来创建、维护一个索引
        IndexWriter indexWriter = new IndexWriter(directory, config);

        for (int i = 0; i < ids.length; i++) {
            // 创建document

//            1. Document   文档
//
//            要索引的数据记录、文档在lucene中的表示，是索引、搜索的基本单元。一个Document由多个字段Field构成。就像数据库的记录-字段。
//
//            IndexWriter按加入的顺序为Document指定一个递增的id（从0开始），称为文档id。反向索引中存储的是这个id，文档存储中正向索引也是这个id。 业务数据的主键id只是文档的一个字段。
            Document doc = new Document();
            //添加字段 添加field 名称字段

//            字段：由字段名name、字段值value（fieldsData）、字段类型 type 三部分构成。
//
//            字段值可以是文本（String、Reader 或 预分析的 TokenStream）、二进制值（byte[]）或数值。
            doc.add(new TextField("id", String.valueOf(ids[i]), Field.Store.YES)); //添加内容
            doc.add(new TextField("title", titles[i], Field.Store.YES)); //添加文件名，并把这个字段存到索引文件里
            doc.add(new TextField("tcontent", tcontents[i], Field.Store.YES)); //添加文件路径
// 将文档添加到索引
            indexWriter.addDocument(doc);

            // 刷新 ??? commit 的东西变多
            indexWriter.flush();
        }
// 提交
        long d = indexWriter.commit();

        System.out.println("共索引了" + d + "个文件");
        // 关闭 会提交
        indexWriter.close();
        directory.close();
        System.out.println("创建索引所用时间：" + (System.currentTimeMillis() - startTime) + "毫秒");

        return true;
    }

    public static void main(String[] args) {
        try {
            boolean r = LuceneIndexer.getInstance().createIndex(INDEX_DIR);
            if (r) {
                System.out.println("索引创建成功!");
            } else {
                System.out.println("索引创建失败!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}


